﻿using System;
using System.Collections.Generic;
using System.Linq;
using System.Web;
using System.Web.UI;
using System.Web.UI.WebControls;
using Domain;
using Telerik.Web.UI;
using Domain.Model;
using Domain.Util;


namespace BelDecor.Net.Pages
{
    public partial class Funcionario : BasePage
    {

        #region EventosPagina
        protected void Page_Load(object sender, EventArgs e)
        {

            if (!IsPostBack)
            {
                ValidaSeguranca("Funcionario");
            }
        }

        protected void btnSalvar_Click(object sender, EventArgs e)
        {
            RadButton btn = ((RadButton)sender);
            int idFunc = 0;
            Domain.Model.Pessoa pessoa = null;
            Domain.Model.Endereco endereco = null;
            Domain.Model.Funcionario funcionario = null;
            Domain.Model.Telefone telefone = null;

            var valid = ValidaFuncionario();

            if (valid == false)
                return;

            try
            {


                if (!string.IsNullOrEmpty(btn.CommandArgument))
                {
                    idFunc = int.Parse(btn.CommandArgument.ToString());
                }

                if (idFunc > 0)
                {
                    funcionario = Domain.Model.Funcionario.SingleOrDefault(f => f.id == idFunc);

                    if (funcionario != null)
                    {
                        SetAtributesFuncionario(ref funcionario);

                        if (funcionario.idPessoa.HasValue)
                        {
                            pessoa = Domain.Model.Pessoa.SingleOrDefault(p => p.idPessoa == funcionario.idPessoa);
                        }
                        else
                        {
                            if (pessoa == null)
                                pessoa = new Domain.Model.Pessoa();
                        }

                        SetAtributesPessoa(ref pessoa);

                        if (pessoa.idEndereco.HasValue)
                        {
                            endereco = Domain.Model.Endereco.SingleOrDefault(end => end.IdEndereco == pessoa.idEndereco);
                        }
                        else
                        {
                            if (endereco == null)
                                endereco = new Domain.Model.Endereco();
                        }

                        if (pessoa.IdTelefone.HasValue)
                        {
                            telefone = Domain.Model.Telefone.SingleOrDefault(t => t.Id_Telefone == pessoa.IdTelefone);
                        }

                        SetAtributesTelefone(ref telefone);

                        SetAtributesEndereco(ref endereco);


                    }
                    else
                    {
                        RadWindowManager1.RadAlert("Não foi possível encontrar os dados do funcionário.", 0, 0, "Atenção", "");
                        return;
                    }

                    //alteração
                }
                else
                {
                    //inclusão
                    endereco = new Domain.Model.Endereco();
                    pessoa = new Domain.Model.Pessoa();
                    funcionario = new Domain.Model.Funcionario();
                    telefone = new Domain.Model.Telefone();

                    SetAtributesEndereco(ref endereco);
                    SetAtributesTelefone(ref telefone);
                    SetAtributesPessoa(ref pessoa);

                    SetAtributesFuncionario(ref funcionario);
                }

                //salva objetos
                endereco.Save();
                telefone.Save();

                pessoa.idEndereco = endereco.IdEndereco;
                pessoa.IdTelefone = telefone.Id_Telefone;
                pessoa.Save();

                funcionario.idPessoa = pessoa.idPessoa;
                funcionario.Save();

                ResetaTela();
                PopulaGridFuncionario(txtConsultarNome.Text, txtConsultarMatricula.Text, txtConsultarCPF.Text);
                RadWindowManager1.RadAlert("Operação concluída com sucesso.", 0, 0, "Atenção", "");
            }
            catch (Exception ex)
            {
                throw ex;
            }
            pnlConsultaFuncionario.Visible = true;
        }

        protected void btnNovo_Click(object sender, EventArgs e)
        {

            matricula.Visible = false;
            txtMatricula.Visible = false;
            ConfiguraInclusao();
            pnlConsultaFuncionario.Visible = false;
        }

        protected void btnBuscar_Click(object sender, EventArgs e)
        {
            try
            {
                PopulaGridFuncionario(txtConsultarNome.Text, txtConsultarMatricula.Text, txtConsultarCPF.Text);
            }
            catch (Exception)
            {
                throw;
            }

        }

        #endregion

        #region Grid

        protected void grdFuncionario_ItemCommand(object sender, GridCommandEventArgs e)
        {

            int idFunc = 0;

            if (e.CommandArgument != "") idFunc = int.Parse(e.CommandArgument.ToString());

            if (e.CommandName == "Editar")
            {
                matricula.Visible = true;
                txtMatricula.Visible = true;

                PopulaEdicaoFuncionario(idFunc);
            }
            else if (e.CommandName == "Excluir")
            {
                ExcluirFuncionario(idFunc);
            }
            else if (e.CommandName == Telerik.Web.UI.RadGrid.ExportToExcelCommandName ||
       e.CommandName == Telerik.Web.UI.RadGrid.ExportToWordCommandName ||
       e.CommandName == Telerik.Web.UI.RadGrid.ExportToCsvCommandName)
            {
                ConfigureExportgrd();
            }
        }

        public void ConfigureExportgrd()
        {
            grdFuncionario.ExportSettings.ExportOnlyData = true;
            grdFuncionario.ExportSettings.IgnorePaging = true;
            grdFuncionario.ExportSettings.OpenInNewWindow = true;
            grdFuncionario.ExportSettings.FileName = string.Format("Funcionario_{0}", DateTime.Now.Ticks);
        }

        #endregion

        #region Metodos
        void ConfiguraInclusao()
        {

            pnlIncluirEditar.Visible = true;
            txtMatricula.Text = string.Empty;
            btnSalvar.CommandArgument = string.Empty;
            txtNome.Text = string.Empty;
            txtEmail.Text = string.Empty;
            txtCargo.Text = string.Empty;
            txtLogin.Text = string.Empty;
            txtSenha.Text = string.Empty;
            ddlSexo.SelectedIndex = 0;
            txtDataNascimento.SelectedDate = null;
            txtCadastroCPF.Text = string.Empty;
            txtCadastroRG.Text = string.Empty;
            txtCargo.Text = string.Empty;
            txtLogradouroEndereco.Text = string.Empty;
            txtNumeroEndereco.Text = string.Empty;
            txtComplemento.Text = string.Empty;
            txtBairroEndereco.Text = string.Empty;
            txtCidadeEndereco.Text = string.Empty;
            txtUF.Text = string.Empty;
            txtCEPCadastro.Text = string.Empty;
            txtTelefoneResidencialDDD.Text = string.Empty;
            txtTelefoneResidencial.Text = string.Empty;
            txtTelefoneCelularDDD.Text = string.Empty;
            txtTelefoneCelular.Text = string.Empty;
            ddlPerfil.SelectedIndex = 0;



        }

        void ResetaTela()
        {
            pnlIncluirEditar.Visible = false;
            btnSalvar.CommandArgument = string.Empty;
            txtMatricula.Text = string.Empty;

            txtNome.Text = string.Empty;
            txtEmail.Text = string.Empty;
            txtCargo.Text = string.Empty;
            txtLogin.Text = string.Empty;
            txtSenha.Text = string.Empty;
            ddlSexo.SelectedIndex = 0;
            txtDataNascimento.SelectedDate = null;
            txtCadastroCPF.Text = string.Empty;
            txtCadastroRG.Text = string.Empty;
            txtCargo.Text = string.Empty;
            txtLogradouroEndereco.Text = string.Empty;
            txtNumeroEndereco.Text = string.Empty;
            txtComplemento.Text = string.Empty;
            txtBairroEndereco.Text = string.Empty;
            txtCidadeEndereco.Text = string.Empty;
            txtUF.Text = string.Empty;
            txtCEPCadastro.Text = string.Empty;
            txtTelefoneResidencialDDD.Text = string.Empty;
            txtTelefoneResidencial.Text = string.Empty;
            txtTelefoneCelularDDD.Text = string.Empty;
            txtTelefoneCelular.Text = string.Empty;
            ddlPerfil.SelectedIndex = 0;

        }

        bool ValidaFuncionario()
        {
            if (string.IsNullOrEmpty(txtNome.Text))
            {
                RadWindowManager1.RadAlert("Informe o campo Nome.", 0, 0, "Atenção", "");
                pnlIncluirEditar.FocusControl(txtNome);
                //txtNome.Focus();
                return false;
            }

            if (ddlSexo.SelectedValue != "M" && ddlSexo.SelectedValue != "F")
            {
                RadWindowManager1.RadAlert("Selecione o sexo.", 0, 0, "Atenção", "");
                pnlIncluirEditar.FocusControl(ddlSexo);
                return false;
            }

            if (txtDataNascimento.SelectedDate == null)
            {
                RadWindowManager1.RadAlert("Informe a data de nascimento.", 0, 0, "Atenção", "");
                pnlIncluirEditar.FocusControl(txtDataNascimento);
                return false;
            }

            if (string.IsNullOrEmpty(txtSenha.Text))
            {
                RadWindowManager1.RadAlert("Informe uma senha.", 0, 0, "Atenção", "");
                pnlIncluirEditar.FocusControl(txtSenha);
                return false;
            }

            if (string.IsNullOrEmpty(txtLogin.Text))
            {
                RadWindowManager1.RadAlert("Informe um login.", 0, 0, "Atenção", "");
                pnlIncluirEditar.FocusControl(txtLogin);
                //TODO: Criar validação para verificar se o login informado já está em uso.

                return false;
            }

            if (!string.IsNullOrWhiteSpace(txtCadastroCPF.Text) || !string.IsNullOrWhiteSpace(txtCadastroRG.Text))
            {
                string cpf = txtCadastroCPF.Text.Trim();
                string rg = txtCadastroRG.Text.Trim();


                IList<Pessoa> lista = Pessoa.Find(p => (!string.IsNullOrEmpty(cpf) ? p.cpf == cpf : true) ||
                 (!string.IsNullOrEmpty(rg) ? p.rg == rg : true));


                if (lista.Count > 1)
                {
                    RadWindowManager1.RadAlert("Usuário já cadastrado na base de dados!", 0, 0, "Atenção", "");
                    pnlIncluirEditar.FocusControl(txtNome);
                    return false;
                }

            }

            return true;

        }

        void SetAtributesFuncionario(ref Domain.Model.Funcionario func)
        {
            func.Matricula = txtMatricula.Text;
            func.Cargo = txtCargo.Text;
            func.Senha = txtSenha.Text;
            func.login = txtLogin.Text;

            if (!func.dataCadastro.HasValue)
            {
                func.dataCadastro = DateTime.Now;
            }

            if (string.IsNullOrEmpty(func.Matricula))
            {
                func.Matricula = Util.Numerador("matriculaFuncionario");
            }

            if (ddlPerfil.SelectedValue != "0")
            {
                func.Perfil = int.Parse(ddlPerfil.SelectedValue);
            }
        }

        void SetAtributesPessoa(ref Domain.Model.Pessoa pessoa)
        {
            pessoa.nome = txtNome.Text;
            pessoa.email = txtEmail.Text;
            pessoa.sexo = ddlSexo.SelectedValue.ToString();

            pessoa.dataNascimento = (DateTime)txtDataNascimento.SelectedDate;

            pessoa.cpf = txtCadastroCPF.Text;
            pessoa.rg = txtCadastroRG.Text;

            if (!pessoa.dataCadastro.HasValue)
            {
                pessoa.dataCadastro = DateTime.Now;
            }
            //pessoa.telefoneCelularDDD = txtTelefoneCelularDDD.Text;
            //pessoa.telefoneCelular = txtTelefoneCelular.Text;
            //pessoa.telefoneResidencial = txtTelefoneResidencial.Text;
            //pessoa.telefoneResidencialDDD = txtTelefoneResidencialDDD.Text;
        }

        void SetAtributesEndereco(ref Domain.Model.Endereco endereco)
        {
            endereco.logradouro = txtLogradouroEndereco.Text;
            endereco.numero = txtNumeroEndereco.Text;
            endereco.complemento = txtComplemento.Text;
            endereco.bairro = txtBairroEndereco.Text;
            endereco.cidade = txtCidadeEndereco.Text;
            endereco.estado = txtUF.Text;
            endereco.cep = txtCEPCadastro.Text;
            endereco.pais = txtPais.Text;

        }

        void SetAtributesTelefone(ref Domain.Model.Telefone telefone)
        {
            telefone.Ddd_Cel = txtTelefoneCelularDDD.Text;
            telefone.celular = txtTelefoneCelular.Text;
            telefone.ddd_fixo = txtTelefoneResidencialDDD.Text;
            telefone.Numero_Fixo = txtTelefoneResidencial.Text;
        }

        void PopulaGridFuncionario(string nome = "",
                                   string matricula = "",
                                   string cpf = "")
        {
            var lstFuncionarios = VwFuncionario.All().Where(f =>
                                                            (!string.IsNullOrEmpty(nome.Trim()) ? f.nome.Contains(nome) : true)
                                                            && (!string.IsNullOrEmpty(matricula.Trim()) ? f.Matricula == matricula.Trim() : true)
                                                            && (!string.IsNullOrEmpty(cpf.Trim()) ? f.cpf == cpf.Trim() : true)).ToList();

            grdFuncionario.DataSource = lstFuncionarios;
            grdFuncionario.DataBind();
            pnlGrid.Visible = true;
        }


        private void ExcluirFuncionario(int idFuncionario)
        {
            try
            {
                Domain.Model.Funcionario.Delete(f => f.id == idFuncionario);
                RadWindowManager1.RadAlert("Operação concluída com sucesso.", 0, 0, "Atenção", "");
                PopulaGridFuncionario();
            }
            catch (Exception)
            {
                throw;
            }
        }

        private void PopulaEdicaoFuncionario(int idFuncionario)
        {
            var func = VwFuncionario.SingleOrDefault(f => f.id == idFuncionario);
            btnSalvar.CommandArgument = idFuncionario.ToString();

            if (func != null)
            {
                txtMatricula.Text = func.Matricula;

                txtNome.Text = func.nome;
                txtEmail.Text = func.email;
                txtCargo.Text = func.Cargo;
                txtLogin.Text = func.login;
                txtSenha.Text = func.Senha;

                if (!string.IsNullOrEmpty(func.sexo))
                {
                    ddlSexo.SelectedValue = func.sexo;
                }

                if (func.Perfil.HasValue)
                {
                    ddlPerfil.SelectedValue = func.Perfil.ToString();
                }

                txtDataNascimento.SelectedDate = func.dataNascimento;
                txtCadastroCPF.Text = func.cpf;
                txtCadastroRG.Text = func.rg;
                txtCargo.Text = func.Cargo;

                txtLogradouroEndereco.Text = func.logradouro;
                txtNumeroEndereco.Text = func.numero;
                txtComplemento.Text = func.complemento;
                txtBairroEndereco.Text = func.bairro;
                txtCidadeEndereco.Text = func.cidade;
                txtUF.Text = func.estado;
                txtPais.Text = func.pais;
                txtCEPCadastro.Text = func.cep;
                txtTelefoneResidencialDDD.Text = func.ddd_fixo;
                txtTelefoneResidencial.Text = func.Numero_Fixo;
                txtTelefoneCelularDDD.Text = func.Ddd_Cel;
                txtTelefoneCelular.Text = func.celular;

                pnlIncluirEditar.Visible = true;
            }
        }
        #endregion




    }
}